import router from "@/router";
import axios from "axios";
import { ElMessage } from "element-plus";


console.log(window.configs.BASE_URL);
const instance = axios.create({
  // ... 公用配置
  baseURL: window.configs.BASE_URL,
  timeout: 5000,
});


instance.interceptors.request.use(
  function (config) {
    // 获取用户信息和token
    let userInfo = localStorage.getItem("user");
    
    if (userInfo) {
      try {
        const tonken = JSON.parse(userInfo);
        // console.log(tonken.user.token)
        if (tonken && tonken.user && tonken.user.token) {
          config.headers.Authorization = `${tonken.user.token}`;
        }
      } catch (e) {
        console.error('解析用户信息失败:', e);
        // 如果解析失败，清理无效的数据
        localStorage.removeItem("user");
      }
    }
    
    // 在请求发送之前做一些处理
    // console.log(config);
    // config.cancelToken = new axios.CancelToken((cancel) => {});
    return config;
  },

  function (error) {
    // 对请求错误做些什么
    // ...
    return Promise.reject(error);
  }
);

// 清除本地存储的登录信息
function clearLoginInfo() {
  localStorage.removeItem("user");
  localStorage.removeItem("userInfo");
}

// 跳转到登录页面
function redirectToLogin() {
  // 如果在登录页面，不重复跳转
  if (router.currentRoute.value.path !== '/login') {
    router.push("/login");
  }
}

instance.interceptors.response.use(
  function (response) {
    // 在响应数据之前做一些处理
    // 处理token过期
    if (response.data.code === 401) {
      ElMessage({
        type: "error",
        message: "登录失效，请重新登录",
      });
      clearLoginInfo();
      redirectToLogin();
      return Promise.reject(new Error('登录失效1'));
    }
    
    if (response.data.code === 200) {
      return response.data;
    } else {
      return response.data;
    }
  },

  function (error) {
    // 处理响应错误
    if (error.response) {
      // 服务器返回了错误响应
      const status = error.response.status;
      
      // 401: 未授权（未登录或token过期）
      if (status === 401) {
        ElMessage({
          type: "error",
          message: "登录失效，请重新登录",
        });
        clearLoginInfo();
        redirectToLogin();
        return Promise.reject(error);
      }
      
      // 403: 没有权限
      if (status === 403) {
        ElMessage.error("没有权限访问该资源");
        return Promise.reject(error);
      }
      
      // 404: 接口不存在
      if (status === 404) {
        ElMessage.error("接口路径不存在");
        return Promise.reject(error);
      }
      
      // 500: 服务器错误
      if (status === 500) {
        ElMessage.error("服务器错误");
        return Promise.reject(error);
      }
      
      // 其他错误
      ElMessage.error(error.response.statusText || "请求失败");
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      if (error.message.indexOf("timeout") !== -1) {
        ElMessage.error("网络超时，请检查网络连接");
      } else if (error.message === "Network Error") {
        ElMessage.error("网络连接错误，请检查网络");
      } else {
        ElMessage.error("无法连接到服务器");
      }
    } else {
      // 其他错误
      ElMessage.error("请求失败");
    }
    
    return Promise.reject(error);
  }
);

/**
 * 请求封装
 */

/**
 * GET 请求
 * @param {string} url - 请求地址
 * @param {object} params - 请求参数
 * @param {object} config - 额外配置
 */
export function get(url, params, config) {
  return instance.get(url, { params, ...config });
}

/**
 * POST 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} config - 额外配置
 */
export function post(url, data, config) {
  return instance.post(url, data, config);
}

/**
 * PUT 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} config - 额外配置
 */
export function put(url, data, config) {
  return instance.put(url, data, config);
}

/**
 * PATCH 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} config - 额外配置
 */
export function patch(url, data, config) {
  return instance.patch(url, data, config);
}

/**
 * DELETE 请求
 * @param {string} url - 请求地址
 * @param {object} config - 额外配置
 */
export function del(url, config) {
  return instance.delete(url, config);
}

/**
 * DELETE 请求（带数据体）
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} config - 额外配置
 */
export function remove(url, data, config) {
  return instance.delete(url, { data, ...config });
}

// 默认导出 axios 实例
export default instance;